package com.douma.第10天;

import java.util.Scanner;

/**
 * 抖码算法，让算法学习变的简单有趣
 *
 * @作者 : 老汤
 */
public class 计算矩阵的最大值 {
    /*
    题目 1：计算矩阵的最大值

    题目描述
    给定一个仅包含0和1的 N*N 二维矩阵，请计算二维矩阵的最大值，计算规则如下：
        ① 每行元素按下标顺序组成一个二进制数（下标越大越排在低位），二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。
        ② 允许通过向左或向右整体循环移动每行元素来改变各元素在行中的位置。 比如：
            [1,0,1,1,1]向右整体循环移动2位变为[1,1,1,0,1]，二进制数为11101，值为29。
            [1,0,1,1,1]向左整体循环移动2位变为[1,1,1,1,0]，二进制数为11110，值为30。

    输入描述:
        输入的第一行为正整数，记录了N的大小，0 < N <= 20。
        输入的第2到N+1行为二维矩阵信息，行内元素半角逗号分隔。

    输出描述:
        矩阵的最大值
     */

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();

        int total = 0;
        for (int i = 0; i < n; i++) {
            // 累加每一行最大值
            String[] line = sc.nextLine().split(",");
            total += lineMax(line);
        }

        System.out.println(total);
    }

    // 计算二维数组中每一行的最大值
    private static int lineMax(String[] line) {
        int max = 0;
        for (int i = 0; i < line.length; i++) {
            // 如果当前这位是 1 的话，那么通过向左或向右整体循环移动，尝试将当前这位作为这一行的首位
            // 因为只有 1 位于首尾才可能是最大值
            if ("1".equals(line[i])) {
                StringBuilder sb = new StringBuilder();
                // 将当前位 1 ，以及他后面的部分先拼接到 sb 中
                for (int m = i; m < line.length; m++) {
                    sb.append(line[m]);
                }
                // 再将当前位的前面部分拼接到 sb 中
                for (int n = 0; n < i; n++) {
                    sb.append(line[n]);
                }
                // 将通过向左或向右整体循环移动后的二进制转化为十进制，求最大值
                max = Math.max(max, Integer.parseInt(sb.toString(), 2));
            }
        }
        return max;
    }
}
